FB - journal

Otázka od: Jaroslav Uher

17. 5. 2004 17:42

Ahoj,

potrebuji resit monitorovani zmen v jednotlivych polich tabulek a
chci to na serveru pomoci triggeru, coz mi pripada nejbezpecnejsi.
V historii konference ale i na Intenetu jsem nic nenasel.

Vytvoril jsem si tabulku (domeny nejsou dulezite)
CREATE TABLE MYJOURNAL
(
ID DM_ID,
DATUM DM_USER_TIMESTAMP,
TABULKA VARCHAR(30), /* nebude s diakritikou */
POLE VARCHAR(30), /* nebude s diakritikou */
REC_KOD VARCHAR(10), /* nebude s diakritikou */
OLD_VALUE VARCHAR(100) CHARACTER SET WIN1250,
NEW_VALUE VARCHAR(100) CHARACTER SET WIN1250,
STRED DM_SI0,
LAST_USER DM_USER_KOD,
PRIMARY KEY (ID)
);

k ni proceduru

SET TERM !! ;
CREATE PROCEDURE INSERT_INTO_MYJOURNAL(
/** Procedure vlozi nove hodnoty do tabulky MYJOURNAL **/
   I_TABULKA VARCHAR(30), /* nebude s diakritikou */
   I_POLE VARCHAR(30), /* nebude s diakritikou */
   I_REC_KOD VARCHAR(10), /* nebude s diakritikou */
   I_OLD_VALUE VARCHAR(100) CHARACTER SET WIN1250,
   I_NEW_VALUE VARCHAR(100) CHARACTER SET WIN1250,
   I_STRED SMALLINT,
   I_LAST_USER CHAR(6))
AS
BEGIN
   INSERT INTO MYJOURNAL
(DATUM,TABULKA,POLE,REC_KOD,OLD_VALUE,NEW_VALUE,STRED,LAST_USER)
   VALUES
('NOW',:I_TABULKA,:I_POLE,:I_REC_KOD,:I_OLD_VALUE,:I_NEW_VALUE,:I_STRE
D,:I_LAST_USER);
END !!
SET TERM ; !!

a v kazde tabulce, kde chci monitorovat zmeny poli
Mam triggeer, napr:

/** TRIGGER AFTER UPDATE **/
SET TERM !! ;

CREATE TRIGGER T_CIS_OBLASTI_JOURNAL FOR CIS_OBLASTI
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE TBL VARCHAR(30);
BEGIN
/* do tabulky MYJOURNAL zapisujeme zmenene hodnoty techto poli
OBLAST_KOD DM_ID ,
NAZEV VARCHAR(25) CHARACTER SET WIN1250,
*/
 TBL = 'CIS_OBLASTI';
 IF (OLD.OBLAST_KOD <> NEW.OBLAST_KOD) THEN
  EXECUTE PROCEDURE INSERT_INTO_MYJOURNAL(TBL,'OBLAST_KOD',NEW.KOD,
                                          CAST(OLD.OBLAST_KOD AS
VARCHAR(10)), /* pretypujeme na VARCHAR */
                                          CAST(NEW.OBLAST_KOD AS
VARCHAR(10)),NEW.STRED,NEW.LAST_USER);
 IF (OLD.NAZEV <> NEW.NAZEV) THEN
  EXECUTE PROCEDURE
INSERT_INTO_MYJOURNAL(TBL,'NAZEV',NEW.KOD,OLD.NAZEV,NEW.NAZEV,NEW.STRE
D,NEW.LAST_USER);
END !!
SET TERM ; !!

ale, uprime <je to pakarna>, samozrejme si na to vytvorim vlastni
generator, jinak bych se 'upsal'

Pokud ma nekdo lepsi reseni a muze ho nabidnout, prosim ... (a dekuji
!)

Jarek Uher


Odpovedá: Pavel Cisar

19. 5. 2004 20:51

Haj hou!

On 17 May 2004 at 18:21, Jaroslav Uher wrote:

> potrebuji resit monitorovani zmen v jednotlivych polich tabulek a
> chci to na serveru pomoci triggeru, coz mi pripada nejbezpecnejsi.
> V historii konference ale i na Intenetu jsem nic nenasel.

Na tohle existuje docela pekny program IBLogManager (komercni), k
videni na webu IBPhoenix.

S pozdravem
Pavel Cisar ( ICQ: 89017288)
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase


Odpovedá: Jaroslav Uher

20. 5. 2004 11:58

Ahoj,

On 19 May 2004 at 21:31, Pavel Cisar wrote:

> > potrebuji resit monitorovani zmen v jednotlivych polich tabulek a
> > chci to na serveru pomoci triggeru, coz mi pripada nejbezpecnejsi. V
> > historii konference ale i na Intenetu jsem nic nenasel.
>
> Na tohle existuje docela pekny program IBLogManager (komercni), k
> videni na webu IBPhoenix.

ten ja znam, ja to potrebuji v nasi aplikaci a do nasi databaze.
To me reseni je dostacujici nasim potrebam.
BTW, inspiraci jsem nasel v Tve knizce, diky  

Jde mi spise o zjednoduseni toho trigeru

DECLARE VARIABLE TBL VARCHAR(30);
BEGIN
 TBL = 'CIS_ICO'; /*zjistit vlastnika (tabulku) trigeru */

 IF (OLD.ICO <> NEW.ICO) THEN /* popripade priradit objekt do
promenne, */
  EXECUTE PROCEDURE
INSERT_INTO_MYJOURNAL(TBL,'ICO',NEW.KOD,OLD.ICO,NEW.ICO);

END

Dekuji za pripadne namety,

Jarek Uher